#include "game.h"
#include "display.c"
#include "btns.c"
#include "uart.c"
#include "timer.c"
#include "lcd12864.c"

// 假设这些函数在 btns.c 中实现
extern bit is_up_btn_pressed();
extern bit is_down_btn_pressed();
extern bit is_left_btn_pressed();
extern bit is_right_btn_pressed();
extern bit is_start_btn_pressed();

void init_shape()
{
    update_timer_seed();
    game_shape.pos = timer_rand() % 4;
    game_shape.type = timer_rand() % 7;
    game_shape.shape = TETRIS_SHAPES[game_shape.type][game_shape.pos];
    update_timer_seed();
    game_shape.next_pos = timer_rand() % 4;
    game_shape.next_type = timer_rand() % 7;
    game_shape.next_shape = TETRIS_SHAPES[game_shape.next_type][game_shape.next_pos];
}

// 方块向下移动
void move_shape_down()
{
    // 这里需要实现方块向下移动的逻辑，假设游戏状态在 game_shape 中
    // 简单示例，需要根据实际情况完善
    // game_shape.y++; 
}

// 方块向左移动
void move_shape_left()
{
    // 这里需要实现方块向左移动的逻辑
    // game_shape.x--; 
}

// 方块向右移动
void move_shape_right()
{
    // 这里需要实现方块向右移动的逻辑
    // game_shape.x++; 
}

// 切换到下一个方块
void switch_to_next_shape()
{
    game_shape.pos = game_shape.next_pos;
    game_shape.type = game_shape.next_type;
    game_shape.shape = game_shape.next_shape;
    update_timer_seed();
    game_shape.next_pos = timer_rand() % 4;
    game_shape.next_type = timer_rand() % 7;
    game_shape.next_shape = TETRIS_SHAPES[game_shape.next_type][game_shape.next_pos];
}

/**
 * 使用上下左右按钮控制方块的移动
 * 使用开始按钮，切换到下一个方块
 */
void main()
{
    // 初始化相关模块
    timer0_init();
    uart_init();
    lcd_init();
    lcd_clear_screan();
    init_shape();

    while (1)
    {
        // 检测按钮状态
        if (is_up_btn_pressed())
        {
            // 这里可以实现方块旋转的逻辑
        }
        else if (is_down_btn_pressed())
        {
            move_shape_down();
        }
        else if (is_left_btn_pressed())
        {
            move_shape_left();
        }
        else if (is_right_btn_pressed())
        {
            move_shape_right();
        }
        else if (is_start_btn_pressed())
        {
            switch_to_next_shape();
        }

        // 这里可以添加更新显示的代码，将方块显示到 LCD 上
        // lcd_display_shape(game_shape); 
    }
}